package com.sojson.project.sys.dept.service;

import java.io.IOException;
import java.util.List;
import java.util.Set;

import com.baomidou.mybatisplus.extension.service.IService;
import com.sojson.base.impl.BaseUser;
import com.sojson.project.sys.dept.entity.dto.DeptDto;
import com.sojson.project.sys.dept.entity.dto.DeptPageDto;
import com.sojson.project.sys.dept.entity.po.Dept;
import com.sojson.project.sys.dept.entity.vo.DeptVo;
import com.sojson.project.sys.menu.entity.bo.TreeSelect;

/**
 * 部门信息表Service
 * 
 * @author liu
 * @date 2022-11-18
 */
public interface DeptService extends IService<Dept> {

    /**
     * 单条插入
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    boolean add(Dept dto) throws IOException;

    /**
     * 通过id更新
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    boolean update(Dept dto) throws IOException;

    /**
     * 通过对象查找
     * 
     * @param dto
     * @return
     */
    List<DeptVo> list(DeptDto dto);

    /**
     * 通过对象分页查找
     * 
     * @param dto
     * @return
     */
    List<DeptVo> page(DeptPageDto dto);

    /**
     * 通过对象删除
     * 
     * @param dto
     * @return
     */
    boolean removeByDto(DeptDto dto);

    /**
     * 清空数据
     * 
     * @return
     */
    boolean clear();

    /**
     * 通过id查找
     * 
     * @param id
     * @return
     * @throws IOException 
     */
    DeptVo findById(String id) throws IOException;

    /**
     * 通过id删除
     * 
     * @param id
     * @return
     * @throws IOException 
     */
    boolean removeById(String id) throws IOException;

    /**
     * 通过id修改状态
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    boolean updateStatus(Dept dto) throws IOException;

    /**
     * 通过部门名称统计数量
     * 
     * @param dto
     * @return
     */
    int countByName(Dept dto);

    /**
     * 判断是否存在子部门
     * 
     * @param id
     * @return
     */
    boolean hasChildById(String id);

    /**
     * 判断部门是否存在用户
     * 
     * @param id
     * @return
     */
    boolean checkDeptExistUser(String id);

    /**
     * 构建前端所需要树结构
     *
     * @param dto   部门列表
     * @return 树结构列表
     */
    List<DeptVo> buildDeptTree(List<DeptVo> dto);

    /**
     * 构建前端所需要下拉树结构
     *
     * @param dto   部门列表
     * @return 下拉树结构列表
     */
    List<TreeSelect> buildDeptTreeSelect(List<DeptVo> dto);

    /**
     * 根据用户ID查询部门树信息
     *
     * @param dto
     * @return 选中部门列表
     */
    List<String> selectDeptListByUserId(DeptDto dto);

    /**
     * 根据角色ID查询部门树信息
     *
     * @param roleId    角色ID
     * @return 选中部门列表
     */
    List<String> selectDeptListByRoleId(String roleId);

    /**
     * 查询部门ID列表
     * 
     * @param dto
     * @return
     * @throws IOException 
     */
    Set<String> listIds(BaseUser dto) throws IOException;

}